package cineplanet.dao;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.sql.DataSource;

import cineplanet.excepcion.DAOExcepcion;
import cineplanet.modelo.Venta;
import cineplanet.modelo.VentaDetalle;

public class VentaDAOImpl extends BaseDAO implements VentaDAO {
	private DataSource dataSource;

	public DataSource getDataSource() {
		return dataSource;
	}

	public void setDataSource(DataSource dataSource) {
		this.dataSource = dataSource;
	}

	public Venta insertar(Venta vo) throws DAOExcepcion {
		System.out.println("PedidoDAOImpl : Insertar()");
		String query = "INSERT INTO cineplanet.venta(idUsuario,idHorario,fechaVenta,cantEntradas,cargoServicio,descuento,subTotal,total) VALUES (?,?,?,?,?,?,?,?)";
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = dataSource.getConnection();
			con.setAutoCommit(false);
			stmt = con.prepareStatement(query);
			stmt.setInt(1, vo.getIdUsuario().getIdUsuario());
			stmt.setInt(2, vo.getIdHorario().getIdHorario());
			stmt.setDate(3, (Date) vo.getFechaVenta());
			stmt.setInt(4, vo.getCantEntradas());
			stmt.setDouble(5, vo.getCargoServicio());
			stmt.setDouble(6, vo.getDescuento());
			stmt.setDouble(7, vo.getSubTotal());
			stmt.setDouble(8, vo.getTotal());

			int i = stmt.executeUpdate();
			// imprime lo que se esta enviando
			System.out.println(stmt);
			if (i != 1) {
				throw new SQLException("No se pudo insertar");
			} // Obtener el ultimo id
			Integer idVentaD1 = 0;
			query = "SELECT LAST_INSERT_ID()";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			if (rs.next()) {
				// vo.setIdVenta(rs.getInt(1));
				idVentaD1 = rs.getInt(1);
			}
			vo.setIdVenta(idVentaD1);
			for (VentaDetalle ventaDetalle : vo.getVentaDetalleCollection()) {
				System.out.println("PedidoDAOImpl : Insertar Detalle()");
				query = "INSERT INTO cineplanet.venta_detalle(idVenta,idProducto,cantProducto,precio,subTotal) VALUES(?,?,?,?,?)";
				stmt = con.prepareStatement(query);
				stmt.setInt(1, idVentaD1);
				stmt.setInt(2, ventaDetalle.getIdProducto().getIdProducto());
				stmt.setInt(3, ventaDetalle.getCantProducto());
				stmt.setDouble(4, ventaDetalle.getPrecio());
				stmt.setDouble(5, ventaDetalle.getSubTotal());
				int u = stmt.executeUpdate();
				// imprime lo que se esta enviando
				// System.out.println(stmt);
				if (u != 1) {
					throw new SQLException("No se pudo insertar");
				}
				Integer idVenta2 = 0;
				query = "SELECT LAST_INSERT_ID()";
				stmt = con.prepareStatement(query);
				rs = stmt.executeQuery();
				if (rs.next()) {
					idVenta2 = rs.getInt(1);
				}
				ventaDetalle.setIdVentaDetalle(idVenta2);
			}
			con.commit();
		} catch (SQLException e) {
			try {
				con.rollback();
			} catch (SQLException e1) {
				throw new DAOExcepcion(e.getMessage());
			}
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			try {
				con.setAutoCommit(true);
			} catch (SQLException e) {
				System.err.println(e.getMessage());
				throw new DAOExcepcion(e.getMessage());
			}
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}

	public Venta actualizar(Venta vo) throws DAOExcepcion {
		System.out.println("PedidoDAOImpl : Insertar()");
		String query = "UPDATE cineplanet.venta set idUsuario=?,idHorario=?,fechaVenta=?,cantEntradas=?,cargoServicio=?,descuento=?,subTotal=?,total=? where idVenta=?";
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = dataSource.getConnection();
			con.setAutoCommit(false);
			stmt = con.prepareStatement(query);
			stmt.setInt(1, vo.getIdUsuario().getIdUsuario());
			stmt.setInt(2, vo.getIdHorario().getIdHorario());
			stmt.setDate(3, (Date) vo.getFechaVenta());
			stmt.setInt(4, vo.getCantEntradas());
			stmt.setDouble(5, vo.getCargoServicio());
			stmt.setDouble(6, vo.getDescuento());
			stmt.setDouble(7, vo.getSubTotal());
			stmt.setDouble(8, vo.getTotal());
			stmt.setInt(9, vo.getIdVenta());
			int i = stmt.executeUpdate();
			// imprime lo que se esta enviando
			System.out.println(stmt);
			if (i != 1) {
				throw new SQLException("No se pudo insertar");
			}
			for (VentaDetalle ventaDetalle : vo.getVentaDetalleCollection()) {
				System.out.println("PedidoDAOImpl : Insertar Detalle()");
				query = "UPDATE cineplanet.venta_detalle SET idProducto=?,cantProducto=?,precio=?,subTotal=? WHERE idVenta=?";
				stmt = con.prepareStatement(query);
				stmt.setInt(1, ventaDetalle.getIdProducto().getIdProducto());
				stmt.setInt(2, ventaDetalle.getCantProducto());
				stmt.setDouble(3, ventaDetalle.getPrecio());
				stmt.setDouble(4, ventaDetalle.getSubTotal());
				stmt.setInt(5, ventaDetalle.getIdVenta().getIdVenta());
				int u = stmt.executeUpdate();
				// imprime lo que se esta enviando
				System.out.println(stmt);
				if (u != 1) {
					throw new SQLException("No se pudo insertar");
				}
			}
			con.commit();
		} catch (SQLException e) {
			try {
				con.rollback();
			} catch (SQLException e1) {
				throw new DAOExcepcion(e.getMessage());
			}
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			try {
				con.setAutoCommit(true);
			} catch (SQLException e) {
				System.err.println(e.getMessage());
				throw new DAOExcepcion(e.getMessage());
			}
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}

	public void eliminar(int idVenta) throws DAOExcepcion {
		String query = "DELETE FROM venta_detalle WHERE idVenta=?";
		String query2 = "DELETE FROM venta WHERE idVenta=?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = dataSource.getConnection();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, idVenta);
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo eliminar");
			}
			stmt = con.prepareStatement(query2);
			stmt.setInt(1, idVenta);
			int u = stmt.executeUpdate();
			if (u != 1) {
				throw new SQLException("No se pudo eliminar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}

}
